package cn.infrabase.token;

import cn.infrabase.Gid;

import javax.annotation.Nullable;
import java.util.Map;

/**
 * 令牌服务接口。
 *
 * @author Weimin Gao
 * @since 1.0.0
 **/
public interface TokenService {

	/**
	 * 返回令牌生成配置。
	 *
	 * @return 令牌生成配置。
	 */
	TokenProperties getTokenProperties();

	/**
	 * 生成令牌。
	 *
	 * @param efftime 令牌有效时间单位秒（值小于等于0时表示永久有效）。
	 * @param tid     令牌标识。
	 * @param data    令牌附加数据。
	 * @return 令牌对象。
	 * @throws TokenException 如果生成令牌发生错误时。
	 */
	Token generate(@Nullable Long efftime, @Nullable Gid tid, @Nullable Map<String,String> data) throws TokenException;

	/**
	 * 生成令牌。
	 *
	 * @param efftime 令牌有效时间单位秒（值小于等于0时表示永久有效）。
	 * @param data    令牌附加数据。
	 * @return 令牌对象。
	 * @throws TokenException 如果生成令牌发生错误时。
	 */
	default Token generate(@Nullable Long efftime, @Nullable Map<String,String> data) throws TokenException {
		return generate(efftime, null, data);
	}

	/**
	 * 生成令牌。
	 *
	 * @param tid  令牌标识。
	 * @param data 令牌附加数据。
	 * @return 令牌对象。
	 * @throws TokenException 如果生成令牌发生错误时。
	 */
	default Token generate(@Nullable Gid tid, @Nullable Map<String,String> data) throws TokenException {
		return generate(null, tid, data);
	}

	/**
	 * 生成令牌。
	 *
	 * @param tid 令牌标识。
	 * @return 令牌对象。
	 * @throws TokenException 如果生成令牌发生错误时。
	 */
	default Token generate(@Nullable Gid tid) throws TokenException {
		return generate(null, tid, null);
	}

	/**
	 * 生成令牌。
	 *
	 * @param data 令牌附加数据。
	 * @return 令牌对象。
	 * @throws TokenException 如果生成令牌发生错误时。
	 */
	default Token generate(@Nullable Map<String,String> data) throws TokenException {
		return generate(null, null, data);
	}

	/**
	 * 生成令牌。
	 *
	 * @return 令牌对象。
	 * @throws TokenException 如果生成令牌发生错误时。
	 */
	default Token generate() throws TokenException {
		return generate(null, null, null);
	}

	/**
	 * 解析令牌。
	 *
	 * @param token 待解析的令牌。
	 * @return 令牌对象。
	 * @throws TokenException 如果解析令牌发生错误时。
	 */
	Token parse(String token) throws TokenException;

	/**
	 * 刷新令牌。
	 *
	 * @param token 待刷新的令牌。
	 * @param data  令牌附加数据。
	 * @return 令牌对象。
	 * @throws TokenException 如果刷新令牌发生错误时。
	 */
	Token refresh(String token, @Nullable Map<String,String> data) throws TokenException;

	/**
	 * 刷新令牌。
	 *
	 * @param token 待刷新的令牌。
	 * @return 令牌对象。
	 * @throws TokenException 如果刷新令牌发生错误时。
	 */
	default Token refresh(String token) throws TokenException {
		return refresh(token, null);
	}

}
